package com.dy.分类.哈希表和字符串._567_字符串的排列;

import java.util.Arrays;

/*
给定两个字符串 s1 和 s2，写一个函数来判断 s2 是否包含 s1 的排列。

换句话说，第一个字符串的排列之一是第二个字符串的子串。

示例1:

输入: s1 = "ab" s2 = "eidbaooo"
输出: True
解释: s2 包含 s1 的排列之一 ("ba").


示例2:

输入: s1= "ab" s2 = "eidboaoo"
输出: False


注意：

输入的字符串只包含小写字母
两个字符串的长度都在 [1, 10,000] 之间
 */
public class Solution {
    public boolean checkInclusion(String s1, String s2) {
        s1 = sort(s1);
        for (int i = 0; i <= s2.length() - s1.length(); i++) {
            if (s1.equals(sort(s2.substring(i, i + s1.length())))) {
                return true;
            }
        }
        return false;
    }

    private String sort(String s1) {
        char[] c = s1.toCharArray();
        Arrays.sort(c);
        return new String(c);
    }

    public boolean checkInclusion2(String s1, String s2) {
        if(s1.length()>s2.length())return false;
        int map[] = new int[26];
        int map2[] = new int[26];
        for (int i = 0; i < s1.length(); i++) {
            map[s1.charAt(i)-'a']++;
            map2[s2.charAt(i)-'a']++;

        }
        for (int i = 0; i < s2.length()-s1.length(); i++) {
            if (maches(map, map2)) {
                return true;
            }
            map2[s2.charAt(i+s1.length())-'a']++;
            map2[s2.charAt(i)-'a']--;


        }
        return maches(map2, map);
    }

    private boolean maches(int[] map, int[] map2) {

        for (int i=0;i<map.length;i++) {
            if (map[i] !=map2[i]) {
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        solution.checkInclusion2("a","ab");
    }
}
